package com.example.filter;

import com.example.utils.Const;
import jakarta.servlet.FilterChain;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpFilter;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

import java.io.IOException;

/**
 * 作者:xuSen
 * 日期2025/4/15 16:50
 */
@Component
@Order(Const.ORDER_CORS)
public class CorsFilter extends HttpFilter {
    /**
     * 执行过滤器的doFilter方法，主要用于处理CORS（跨域资源共享）
     * 此方法首先调用addCorsHeaders方法为响应添加CORS头，以允许跨域请求
     * 然后使用chain.doFilter方法将请求继续传递给过滤链中的下一个元素
     * 这里的处理逻辑确保了在请求处理的不同阶段，CORS策略能够被正确应用
     */
    @Override
    protected void doFilter(HttpServletRequest request,
                            HttpServletResponse response,
                            FilterChain chain) throws IOException, ServletException {
        // 为当前请求和响应添加CORS头
        this.addCorsHeaders(request, response);
        // 将请求传递给过滤链中的下一个过滤器或目标资源
        chain.doFilter(request, response);
    }

    /**
     * 为响应添加CORS（跨域资源共享）头部
     * CORS是一种机制，它使用额外的HTTP头部来告诉浏览器允许一个域上的网页访问另一个域上的选定资源
     * 这对于前端应用运行在与后端API不同的域名上时非常有用
     */
    private void addCorsHeaders(HttpServletRequest request, HttpServletResponse response) {
        // 设置允许跨域请求的源，这里动态获取请求中的Origin头部值
        response.setHeader("Access-Control-Allow-Origin", request.getHeader("Origin"));
        // 设置允许的HTTP方法，这里允许GET, POST, PUT, DELETE, OPTIONS请求
        response.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
        // 设置允许的请求头，这里允许Content-Type和Authorization
        response.setHeader("Access-Control-Allow-Headers", "Content-Type, Authorization");

    }
}
